package com.itic.appbase.framework.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

/**
 * 日期工具类.
 * <p>
 * Company: itic
 * </p>
 * 
 * @author: idong
 * @date: 2015年5月8日 上午9:52:28
 * @version: V1.0
 */
public class DateHelper extends DateUtils {
    private static String DEFAULT_SHORT = "yyyy-MM-dd";
    private static String DEFAULT_LONG = "yyyy-MM-dd HH:mm:ss";

    private static String[] parsePatterns = { DEFAULT_SHORT, DEFAULT_LONG,
            "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss",
            "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss",
            "yyyy.MM.dd HH:mm", "yyyy.MM" };

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd）.
     * 
     * @return String yyyy-MM-dd
     */
    public static String getDate() {
        return getDate(DEFAULT_SHORT);
    }

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为：DEFAULT_SHORT "HH:mm:ss" "E".
     * 
     * @param pattern
     * @return String 指定的输出格式
     */
    public static String getDate(String pattern) {
        return DateFormatUtils.format(new Date(), pattern);
    }

    /**
     * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为：DEFAULT_SHORT "HH:mm:ss" "E".
     * 
     * @param date
     *            需要转换的日期
     * @param pattern
     *            指定的输出格式
     * @return String 指定格式的字符串，默认yyyy-MM-dd
     */
    public static String formatDate(Date date, Object... pattern) {
        String formatDate = null;
        if (null == date) {
            return formatDate;
        }
        if (pattern != null && pattern.length > 0) {
            formatDate = DateFormatUtils.format(date, pattern[0].toString());
        } else {
            formatDate = DateFormatUtils.format(date, DEFAULT_SHORT);
        }
        return formatDate;
    }

    /**
     * 得到日期+时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）. \
     * 
     * @param date
     *            需要转换的日期+时间
     * @return String yyyy-MM-dd HH:mm:ss
     */
    public static String formatDateTime(Date date) {
        return formatDate(date, DEFAULT_LONG);
    }

    /**
     * 得到当前时间字符串 格式（HH:mm:ss）. \
     * 
     * @return String HH:mm:ss
     */
    public static String getTime() {
        return formatDate(new Date(), "HH:mm:ss");
    }

    /**
     * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）.
     * 
     * @return String yyyy-MM-dd HH:mm:ss
     */
    public static String getDateTime() {
        return formatDate(new Date(), DEFAULT_LONG);
    }

    /**
     * 得到当前年份字符串 格式（yyyy）.
     * 
     * @return String yyyy
     */
    public static String getYear() {
        return formatDate(new Date(), "yyyy");
    }

    /**
     * 得到当前月份字符串 格式（MM）.
     * 
     * @return String MM
     */
    public static String getMonth() {
        return formatDate(new Date(), "MM");
    }

    /**
     * 得到当天字符串 格式（dd）.
     * 
     * @return String dd
     */
    public static String getDay() {
        return formatDate(new Date(), "dd");
    }

    /**
     * 得到当前星期字符串 格式（E）星期几.
     * 
     * @return String E
     */
    public static String getWeek() {
        return formatDate(new Date(), "E");
    }

    /**
     * 日期型字符串转化为日期,
     * 
     * @param str
     *            需要转换的字符串
     * @return Date 日期对象
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            // 严格的日期转换，如2015-06-31转换抛异常
            return parseDateStrictly(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 日期型字符串转化为日期.
     * 
     * @param str
     *            需要转换的字符串
     * @return Date 日期对象
     */
    public static Date parseDateLoose(Object str) {
        if (str == null) {
            return null;
        }
        try {
            // 宽松的日转换，2015-06-31转换正常，转换后的日期格式为2015-07-01
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取过去的天数.
     * 
     * @param date
     *            开始时间
     * @return long 天数
     */
    public static long pastDays(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (24 * 60 * 60 * 1000);
    }

    /**
     * 获取过去的小时.
     * 
     * @param date
     *            开始时间
     * @return long 小时数
     */
    public static long pastHour(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 60 * 1000);
    }

    /**
     * 获取过去的分钟.
     * 
     * @param date
     *            开始时间
     * @return long 分钟
     */
    public static long pastMinutes(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 1000);
    }

    /**
     * 转换为时间（天,时:分:秒.毫秒）.
     * 
     * @param timeMillis
     *            需要转换的毫秒值
     * @return String day，hour，min，s，ss
     */
    public static String formatDateTime(long timeMillis) {
        long day = timeMillis / (24 * 60 * 60 * 1000);
        long hour = timeMillis / (60 * 60 * 1000) - day * 24;
        long min = (timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60;
        long s = timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min
                * 60;
        long sss = timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60
                * 1000 - min * 60 * 1000 - s * 1000;
        return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "."
                + sss;
    }
    
    /**
     * 获取Date类型的年
     * 
     * @param date
     * return int
     */
    public static int getYear(Date date) {
        Calendar dd = Calendar.getInstance();
        dd.setTime(date);
        return dd.get(Calendar.YEAR);
    }

    /**
     * 获取两个日期之间的天数.
     * 
     * @param before
     * @param after
     * @return
     */
    public static double getDistanceOfTwoDate(Date before, Date after) {
        long beforeTime = before.getTime();
        long afterTime = after.getTime();
        return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
    }
    
    /**
     * 判断两日期的大小
     * now 时间大或者等于 compa 则返回 true
     *                   否则返回 false
     */
    public static boolean isGreater(String now,String compa){
    	boolean flag = false;
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    	try{
    		Date dt1 = df.parse(now);
            Date dt2 = df.parse(compa);
        	if( dt1.getTime()>=dt2.getTime() ){
        		flag = true;
        	}else{
        		flag = false;
        	}
    	}catch(Exception exception){
    		  exception.printStackTrace();
    	}
    	return flag;
    }
    
    /**
     * 根据日期字串获得DATE类型"yyyy-MM-dd hh:mm:ss"
     */
    public static Date getDateByStringDate(String date){
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    	Date parse = null;
    	try {
    		parse = df.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return parse;
    }
    
    
    /**
     * 判断now时间是不是在 start与 end时间之间 如果为空则返回真
     * @param now
     * @param start
     * @param end
     * @return true为在之间，false为不在之间
     */
    public static boolean isInStartTimeAndStopTime(String now,String start,String end){
    	
    	boolean flag = false;
    	//没有结束时间的
    	if( !StringHelper.isNotBlank(end) ){
    		if( StringHelper.isNotBlank(start) ){
    			if( isGreater(now,start+" 00:00:00") ){
        		    flag = true;	
        		}
    		}else{
    			flag = true;
    		}
    		
    	}else{
    		if( StringHelper.isNotBlank(end) ){
    			if( isGreater(now,start+" 00:00:00") ){
            		boolean less = isGreater(now,end+" 23:59:59");
            		if(!less){
            			flag=true;
            		}
            	}
    		}else{
    			flag=true;
    		}
    	}
    	return flag;
    }
    
    
    /**
     * 时间integer转成String（yyyy-mm-dd）
     * @param date 转换的时间来源
     * @param dateFormat 需要转换成的时间格式
     * @return
     */
    public static String getDateStringByDate(Date date,String dateFormat){
    	String time="";
    	if( null != date && StringHelper.isNotBlank(dateFormat) ){
    		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    	    time = sdf.format(date);
    	}
    	return time;
    }
    
    
}
